
/**********************************************************************************\
** 文件名称: PackTask.h
** 创建人员: YCG
** 创建日期: 2019-05-05
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#ifndef __PACK_TASK_H_
#define __PACK_TASK_H_

#include "main.h"

#define Pack_DEBUG

#ifdef  Pack_DEBUG
#include "MessageOut.h"
#include "oled.h"
#define  Pack_Printf(fmt,...)   Uprintf(fmt,__VA_ARGS__)
#else
#define  Pack_Printf(...)
#endif


#define U32_BEGIN   0xa86923c3

#define Allgnment4(yNum) ((yNum&0x03)==0?yNum:yNum+4-(yNum&0x03))
#define PackSize(yPack) ( sizeof(PackPack_t) + Allgnment4(yPack->DataNum.u16))

typedef union
{
    uint8_t  u8[4];
    uint32_t u32;
} Word_v;

typedef union
{
    uint8_t  u8[2];
    uint16_t u16;
} HalfWord_v;

typedef enum
{
    Pack_Start = 1,
    Pack_PackType,
    Pack_PackTypeCheck,
    Pack_SourceAdd,
    Pack_DestinationAdd,
    Pack_PackNum,
    Pack_DataNum,
    Pack_CRC32_1,
    Pack_ReceData,
    Pack_CRC32_2
	
} PackReceState;

typedef struct PACK_t
{
    Word_v     StartCheck;  //起始信号检测

    HalfWord_v PackCtrl;    //包控制
    HalfWord_v DataNum;     //数据数量
    HalfWord_v PackNum;     //帧总数量
    HalfWord_v PackCount;   //帧计数

    Word_v	   PackCRC;     //帧头CRC
    uint8_t	   Data;        //数据
    //通过计算获取数据CRC地址
} Pack_t;


typedef struct Pack_RECEIVE_T
{
    Pack_t PackPack;           //接收到的数据
    PackReceState State;    //接收状态
    uint8_t  ErrCode;          //错误代码
    uint8_t  Count8;           //接收状态计数
    uint32_t Count32;          //接收数据计数
    uint8_t * Data;
} PackRece_t;

void PackTask(void * argument);
#endif

/********************************End of File************************************/

